#ifndef CORO_H
#define CORO_H

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stddef.h>
#include <string.h>
#include <stdint.h>
#include <ucontext.h>

#define DEFAULT_STACK_SZIE (1024*128)

#define DEFAULT_COROUTINE 1024   //默认协程数量
#define MAIN_CO_ID 0    //主协程id号

/*
    CO_STATUS_DEAD 线程执行结束
    CO_STATUS_SUSPEND 协程创建后未resume，或yield后处的状态
    CO_STATUS_RUNNING 协程当前正在运行
    CO_STATUS_NORMAL 当前协程resume了其他协程，此时处于这个状态
*/
enum CORO_STATUS{CO_STATUS_DEAD,CO_STATUS_SUSPEND,CO_STATUS_RUNNING,CO_STATUS_NORMAL};

struct schedule_t;  //协程调度器s
typedef void (*co_func)(void *arg);

//协程
typedef struct coro
{
    int pre_coro;//前一个协程，帮助退回
    struct schedule_t* sch;//调度器

    ucontext_t ctx; //协程上下文
    co_func func;   //回调函数
    void *arg;      //参数
    enum CORO_STATUS status; //当前状态
    char *stack;    //栈内存
}coro;

//协程调度器
typedef struct schedule_t
{
    int satck_size; //栈大小
    int running_coro;   //正在运行的协程
    
    coro **co;  //协程数组,存指向协程的指针
    int co_numbers;   //当前协程数量
    int co_cap;  //当前协程数组容量
}schedule_t;

//打开调度器
schedule_t* sch_open(int stsize);
//关闭调度器
void sch_close(schedule_t *schedule);


 /*获取在运行的协程id*/
int get_co_running(schedule_t& schedule);
/* 创建协程 */
int  coro_create(schedule_t *schedule,co_func func,void *arg);
/* 挂起协程 */
void coro_yield(schedule_t &schedule);
/* 恢复指定id号的协程运行 */
void coro_resume(schedule_t *schedule,int id);
/* 获取协程的状态 */
enum CORO_STATUS coro_status(schedule_t &schedule, int id);

static void cofunc(schedule_t* schedule);

#endif